/**
 * 此配置在主配置之前单独执行
 * 用于将node_modules中的依赖打包成单独的 vender.dll.js文件
 * 打包输出 vender.dll.js vender-manefest.json
 * vender-manefest.json 保存依赖文件路径和自增id的映射，该文件用于主配置执行时将依赖文件路径替换为id
 *
 */
/* eslint-disable */
const path = require('path');
const webpack = require('webpack');

module.exports = {
    entry: {
        'react': ['react', 'react-dom', 'react-router', 'react-router-dom', 'react-loadable'], // 遍历package.json的所有依赖包
        'redux': ['redux', 'react-redux'],
    },
    output: {
        path: path.join(__dirname, 'public'), // 生成的文件存放路径
        filename: '[name].dll.js', // 生成的文件名字(默认为vendor.dll.js)
        library: '[name]_library', // 打包内容生成文件的映射关系，与下面DllPlugin中配置对应；以全局变量[name]_library方式暴露
    },
    plugins: [
        new webpack.DllPlugin({
            // 会生成一个json文件，里面是关于dll.js的一些配置信息
            path: path.join(__dirname, 'public', '[name].manifest.json'),
            name: '[name]_library', // 与上面output中配置对应
            context: __dirname, // 上下文环境路径（必填，为了与DllReferencePlugin存在与同一上下文中）
        }),
    ],
};

/**
 * vendor.dll.js 整体结构
 */
`
let vendor_library = function(t) {
    /**
     * webpackBootStrap
     */
const modules = {};

function __webpack_require__(moduleId) {
    if (modules[moduleId]) return modules[moduleId].exports;
    var module = modules[moduleId] = {moduleId: moduleId, load: false, exports: {}};
    return t[moduleId].call(module.exports, module, module.exports, __webpack_require__), module.l = true, module.exports;
}

    return __webpack_require__(t.length - 1);
}([
    /**
     * 依赖模块
     * @param module
     * @param exports
     * @param __webpack_require__
     */
    function(module, exports, __webpack_require__) {
        //module content
        exports = {};
    },
    /**
     * 最后一个固定为此函数，不会出现在manifest.json中  返回__webpack_require__
     * @param module
     * @param exports
     * @param __webpack_require__
     */
    function(module, exports, __webpack_require__) {
        module.exports = __webpack_require__;
    },
]);
 `;

/**
 * vender.manifest.json
 */
let manifest = {
    name: 'vendor_library',
    context: {
        './node_modules/prop-types/index.js': {
            id: 0,
            buildMeta: {
                providedExports: true,
            },
        },
    },
};

/* eslint-enable */